#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/7/13 9:55
# @Author : linjinting
# @Project : PDFTools
# @File : convert_word.py
# @Software: PyCharm


from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams, LTImage, LTCurve, LTFigure, LTTextBoxHorizontal
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
from docx import Document
#
document = Document()

def parse(source_file, out_file):
    # rb以二进制读模式打开本地pdf文件
    fn = open(source_file, 'rb')
    # 创建一个pdf文档分析器
    parser = PDFParser(fn)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 连接分析器 与文档对象
    parser.set_document(doc)
    doc.set_parser(parser)

    # 提供初始化密码doc.initialize("lianxipython")
    # 如果没有密码 就创建一个空的字符串
    doc.initialize("")
    # 检测文档是否提供txt转换，不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed

    else:
        # 创建PDf资源管理器
        resource = PDFResourceManager()
        # 创建一个PDF参数分析器
        laparams = LAParams()
        # 创建聚合器,用于读取文档的对象
        device = PDFPageAggregator(resource, laparams=laparams)
        # 创建解释器，对文档编码，解释成Python能够识别的格式
        interpreter = PDFPageInterpreter(resource, device)
        # 循环遍历列表，每次处理一页的内容
        # doc.get_pages() 获取page列表

        num_page, num_image, num_curve, num_figure, num_TextBoxHorizontal = 0, 0, 0, 0, 0
        # 循环遍历列表，每次处理一个page的内容
        for page in doc.get_pages():  # doc.get_pages() 获取page列表
            num_page += 1  # 页面增一
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout = device.get_result()
            for out in layout:
                if isinstance(out, LTImage):  # 图片对象
                    num_image += 1
                    content = out.stream
                    size = out.srcsize
                    document.add_picture(content, size[0], size[1])
                if isinstance(out, LTCurve):  # 曲线对象
                    num_curve += 1
                if isinstance(out, LTFigure):  # figure对象
                    num_figure += 1
                if isinstance(out, LTTextBoxHorizontal):  # 获取文本内容
                    num_TextBoxHorizontal += 1  # 水平文本框对象增一
                    content = out.get_text().replace(u'\xa0', u' ')  # 将'\xa0'替换成u' '空格，这个\xa0就是&nbps空格
                    # 保存文本内容
                    document.add_paragraph(content)
            document.add_page_break()
                    # with open(r'test2.doc', 'a', encoding='utf-8') as f:  # 生成doc文件的文件名及路径
                    #     results = x.get_text()
                    #     f.write(results)
                    #     f.write('\n')
        document.save(out_file)
        print('对象数量：\n', '页面数：%s\n' % num_page, '图片数：%s\n' % num_image, '曲线数：%s\n' % num_curve, '水平文本框：%s\n' % num_TextBoxHorizontal)

if __name__ == '__main__':
    parse('pdf/test11.pdf', 'test.docx')